{% extends "base.html" %}
{% block subtitle %}各项评分细则{% endblock %}
{% block content -%}
<div class="row">
  <div class="col-md-9 manual">
    <h1 class="faq-heading">各项评分细则</h1>

    <section>
      <h2 id="code-style">代码风格评分</h2>

      <subsection>
        <h3 id="python-pep8">Python 代码风格评分</h3>
        <p>
          <img src="{{ url_for('static', filename='img/scores/style-score-zh.png') }}"
               alt="PEP8 风格评分" class="img-thumbnail" />
        </p>
        <p>
          Python 代码风格要求遵照 PEP8 规范，可以参考官方文档：<a href="http://legacy.python.org/dev/peps/pep-0008/">http://legacy.python.org/dev/peps/pep-0008/</a>。
        </p>
        <p>
          对于学生提交上来的文件，系统会对所有 .py 文件进行代码风格评测。每一个问题扣除一定分数（在一般情况下，每一个问题扣除 10 分，而代码风格得分的权重一般为 0.1，因此折算下来每一个问题扣除 1 分），直到该项得分为 0。
        </p>
        <p>
          <img src="{{ url_for('static', filename='img/scores/pep8.png') }}"
               alt="PEP8 检测工具" class="img-thumbnail" />
        </p>
        <p>
          可以在本地安装 PEP8 代码规范检测工具。执行 <kbd>pip install pep8</kbd>，在需要
          检测代码格式的目录中执行 <kbd>pep8 .</kbd>，就可以检查当前目录下所有文件。有一些文本编辑器支持 PEP8 检查，比如安装了 SublimePythonIDE 的 Sublime Text 3，可以标识不满足规范的代码行：
        </p>
        <p>
          <img src="{{ url_for('static', filename='img/scores/pep8-ide.png') }}"
               alt="PEP8 文本编辑器" class="img-thumbnail" />
        </p>
      </subsection>

    </section>

    <section>
      <h2 id="function">功能性测试评分</h2>
      <p>
        <img src="{{ url_for('static', filename='img/scores/function-zh.png') }}"
             alt="功能性测试评分" class="img-thumbnail" />
      </p>
      <p>
        功能性测试得分为 <code>100 * 通过的测例 / 测例总数</code>。需要注意的是，学生可能看不到测例通过与否的详细信息。如果实在无法通过测试，可以联系助教。
      </p>
    </section>

    <section>
      <h2 id="coverage">覆盖率评分</h2>
      <p>
        <img src="{{ url_for('static', filename='img/scores/coverage-zh.png') }}"
             alt="覆盖率评分" class="img-thumbnail" />
      </p>
      <p>
        覆盖率评分是为单元测试以及白盒测试作业设计的评分方法，学生提交的单元测试代码对教师给出的函数或者类的覆盖率将会作为此项评分的依据。其中，语句覆盖率和分支覆盖率各占总分的一定比例（具体比例由每一个作业规定）。
      </p>
      <p>
        特别需要注意的是，分支覆盖率有两种：完全覆盖和部分覆盖。部分覆盖的分支只能得到一半的分数。
      </p>
      <p>
        比如在上图中，语句覆盖率为 84.62%，分支完全覆盖率为 50%、部分覆盖率为 33.33%。语句覆盖率的权重为 0.4，分支覆盖率的权重为 0.5。则最终得分为：<code>84.62 * 0.4 + 50 * 0.5 + 33.33 * 0.25 = 67.18</code>。
      </p>
    </section>

    <section>
      <h2 id="objschema">对象结构评分</h2>
      <p>
        <img src="{{ url_for('static', filename='img/scores/objschema-zh.png') }}"
             alt="对象结构评分" class="img-thumbnail" />
      </p>
      <p>
        对象结构评分是为单元测试作业设计的评分方法。在这一类作业中，教师会对学生的单元测试代码做出严格的规定，包括每一个模块应当由哪些对应的测试模块进行测试，每一个函数由哪个测试集测试，以及这些函数应当有哪些测试点。每一个要求为一个得分点，最终成绩将由通过的得分点所占比例决定。
      </p>
    </section>

    <section>
      <h2 id="input-class">输入等价类评分</h2>
      <p>
        <img src="{{ url_for('static', filename='img/scores/input-class-zh.png') }}"
             alt="输入等价类评分" class="img-thumbnail" />
      </p>
      <p>
        输入等价类是为黑盒测试作业设计的评分方法，学生提交的数据对教师给出描述的模块的输入等价类的覆盖率将会作为此项评分的依据，覆盖的百分比是得分。注意，学生可能看不到等价类的详细信息，如果实在无法通过测试，可以联系助教。
      </p>
    </section>

    <section>
      <h2 id="boundary-value">输入边界值评分</h2>
      <p>
        <img src="{{ url_for('static', filename='img/scores/boundary-value-zh.png') }}"
             alt="输入边界值评分" class="img-thumbnail" />
      </p>
      <p>
        输入边界值是为黑盒测试作业设计的评分方法，学生提交的数据对教师给出描述的模块的输入边界值的覆盖率将会作为此项评分的依据，覆盖的百分比是得分。注意，学生可能看不到等价类的详细信息，如果实在无法通过测试，可以联系助教。
      </p>
    </section>
  </div>

  <!--
    TOC navigate bar here.
    The navigate content will be generated by railgun.js dynamically.
  -->
  <nav id="toc-navigate" class="sidebar col-md-3 hidden-sm hidden-xs">
    <ul class="nav sidenav" data-spy="affix" data-offset-top="120">
    </ul>
  </nav>
</div>
{%- endblock %}
<!-- Enable TOC navigation by following attributes in body tag -->
{% block bodyattrs %}
  data-spy="scroll" data-target="#toc-navigate"
{%- endblock %}
